Skip to content

Commit 517f220

Browse files
- Use camerax to implement image capture in-app instead of using the native camera app to reduce the possibility of app being killed due to GPU OOM.
- Show accelerator name in chat message sender labels. - Attach download workers with silent foreground notifications to make them less likely to be killed. - Update app icon to be consistent with Google style. - Bump up version to 1.0.2.
1 parent f50d065 commit 517f220

36 files changed

+284
-69
lines changed

Android/src/app/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ android {
3131
minSdk = 26
3232
targetSdk = 35
3333
versionCode = 1
34-
versionName = "1.0.1"
34+
versionName = "1.0.2"
3535

3636
// Needed for HuggingFace auth workflows.
3737
manifestPlaceholders["appAuthRedirectScheme"] = "com.google.ai.edge.gallery.oauth"

Android/src/app/src/main/AndroidManifest.xml

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
1919
xmlns:tools="http://schemas.android.com/tools">
2020

21-
<!-- <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>-->
22-
<!-- <uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC"/>-->
21+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
22+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC"/>
2323
<uses-permission android:name="android.permission.INTERNET" />
2424
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
2525
<uses-permission android:name="android.permission.CAMERA" />
@@ -83,11 +83,12 @@
8383
android:resource="@xml/file_paths" />
8484
</provider>
8585

86-
<!-- <service-->
87-
<!-- android:name=".GalleryService"-->
88-
<!-- android:foregroundServiceType="dataSync"-->
89-
<!-- android:exported="false">-->
90-
<!-- </service>-->
86+
<service
87+
android:name="androidx.work.impl.foreground.SystemForegroundService"
88+
android:foregroundServiceType="dataSync"
89+
android:exported="false"
90+
tools:node="merge">
91+
</service>
9192
</application>
9293

9394
</manifest>

Android/src/app/src/main/java/com/google/ai/edge/gallery/data/Consts.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package com.google.ai.edge.gallery.data
1818

1919
// Keys used to send/receive data to Work.
2020
const val KEY_MODEL_URL = "KEY_MODEL_URL"
21+
const val KEY_MODEL_NAME = "KEY_MODEL_NAME"
2122
const val KEY_MODEL_VERSION = "KEY_MODEL_VERSION"
2223
const val KEY_MODEL_DOWNLOAD_MODEL_DIR = "KEY_MODEL_DOWNLOAD_MODEL_DIR"
2324
const val KEY_MODEL_DOWNLOAD_FILE_NAME = "KEY_MODEL_DOWNLOAD_FILE_NAME"

Android/src/app/src/main/java/com/google/ai/edge/gallery/data/DownloadRepository.kt

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import android.content.Context
2424
import android.content.Intent
2525
import android.content.pm.PackageManager
2626
import android.net.Uri
27-
import android.os.Build
2827
import android.util.Log
2928
import androidx.core.app.ActivityCompat
3029
import androidx.core.app.NotificationCompat
@@ -92,7 +91,8 @@ class DefaultDownloadRepository(
9291
val builder = Data.Builder()
9392
val totalBytes = model.totalBytes + model.extraDataFiles.sumOf { it.sizeInBytes }
9493
val inputDataBuilder =
95-
builder.putString(KEY_MODEL_URL, model.url).putString(KEY_MODEL_VERSION, model.version)
94+
builder.putString(KEY_MODEL_NAME, model.name).putString(KEY_MODEL_URL, model.url)
95+
.putString(KEY_MODEL_VERSION, model.version)
9696
.putString(KEY_MODEL_DOWNLOAD_MODEL_DIR, model.normalizedName)
9797
.putString(KEY_MODEL_DOWNLOAD_FILE_NAME, model.downloadFileName)
9898
.putBoolean(KEY_MODEL_IS_ZIP, model.isZip).putString(KEY_MODEL_UNZIPPED_DIR, model.unzipDir)
@@ -271,13 +271,11 @@ class DefaultDownloadRepository(
271271

272272
// Create the NotificationChannel, but only on API 26+ because
273273
// the NotificationChannel class is new and not in the support library
274-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
275-
val importance = NotificationManager.IMPORTANCE_HIGH
276-
val channel = NotificationChannel(channelId, channelName, importance)
277-
val notificationManager: NotificationManager =
278-
context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
279-
notificationManager.createNotificationChannel(channel)
280-
}
274+
val importance = NotificationManager.IMPORTANCE_HIGH
275+
val channel = NotificationChannel(channelId, channelName, importance)
276+
val notificationManager: NotificationManager =
277+
context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
278+
notificationManager.createNotificationChannel(channel)
281279

282280
// Create an Intent to open your app with a deep link.
283281
val intent = Intent(

Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/common/chat/ChatMessage.kt

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,19 @@ data class Classification(val label: String, val score: Float, val color: Color)
4444

4545
/** Base class for a chat message. */
4646
open class ChatMessage(
47-
open val type: ChatMessageType, open val side: ChatSide, open val latencyMs: Float = -1f
47+
open val type: ChatMessageType,
48+
open val side: ChatSide,
49+
open val latencyMs: Float = -1f,
50+
open val accelerator: String = "",
4851
) {
4952
open fun clone(): ChatMessage {
5053
return ChatMessage(type = type, side = side, latencyMs = latencyMs)
5154
}
5255
}
5356

5457
/** Chat message for showing loading status. */
55-
class ChatMessageLoading : ChatMessage(type = ChatMessageType.LOADING, side = ChatSide.AGENT)
58+
class ChatMessageLoading(override val accelerator: String = "") :
59+
ChatMessage(type = ChatMessageType.LOADING, side = ChatSide.AGENT, accelerator = accelerator)
5660

5761
/** Chat message for info (help). */
5862
class ChatMessageInfo(val content: String) :
@@ -79,12 +83,19 @@ open class ChatMessageText(
7983

8084
// Benchmark result for LLM response.
8185
var llmBenchmarkResult: ChatMessageBenchmarkLlmResult? = null,
82-
) : ChatMessage(type = ChatMessageType.TEXT, side = side, latencyMs = latencyMs) {
86+
override val accelerator: String = "",
87+
) : ChatMessage(
88+
type = ChatMessageType.TEXT,
89+
side = side,
90+
latencyMs = latencyMs,
91+
accelerator = accelerator
92+
) {
8393
override fun clone(): ChatMessageText {
8494
return ChatMessageText(
8595
content = content,
8696
side = side,
8797
latencyMs = latencyMs,
98+
accelerator = accelerator,
8899
isMarkdown = isMarkdown,
89100
llmBenchmarkResult = llmBenchmarkResult,
90101
)
@@ -168,10 +179,12 @@ class ChatMessageBenchmarkLlmResult(
168179
val statValues: MutableMap<String, Float>,
169180
val running: Boolean,
170181
override val latencyMs: Float = 0f,
182+
override val accelerator: String = "",
171183
) : ChatMessage(
172184
type = ChatMessageType.BENCHMARK_LLM_RESULT,
173185
side = ChatSide.AGENT,
174-
latencyMs = latencyMs
186+
latencyMs = latencyMs,
187+
accelerator = accelerator,
175188
)
176189

177190
data class Histogram(

Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/common/chat/ChatPanel.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ import androidx.compose.ui.text.AnnotatedString
8080
import androidx.compose.ui.tooling.preview.Preview
8181
import androidx.compose.ui.unit.dp
8282
import com.google.ai.edge.gallery.R
83-
import com.google.ai.edge.gallery.data.ConfigKey
8483
import com.google.ai.edge.gallery.data.Model
8584
import com.google.ai.edge.gallery.data.Task
8685
import com.google.ai.edge.gallery.data.TaskType
@@ -266,9 +265,13 @@ fun ChatPanel(
266265
horizontalAlignment = hAlign,
267266
) messageColumn@{
268267
// Sender row.
268+
var agentName = stringResource(task.agentNameRes)
269+
if (message.accelerator.isNotEmpty()) {
270+
agentName = "$agentName on ${message.accelerator}"
271+
}
269272
MessageSender(
270273
message = message,
271-
agentName = stringResource(task.agentNameRes),
274+
agentName = agentName,
272275
imageHistoryCurIndex = imageHistoryCurIndex.intValue
273276
)
274277

Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/common/chat/ChatViewModel.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ open class ChatViewModel(val task: Task) : ViewModel() {
141141
content = newContent,
142142
side = lastMessage.side,
143143
latencyMs = latencyMs,
144+
accelerator = lastMessage.accelerator,
144145
)
145146
newMessages.removeAt(newMessages.size - 1)
146147
newMessages.add(newLastMessage)

0 commit comments

Comments
 (0)